package kov.core
{
	import flash.display.DisplayObject;
	import flash.utils.Dictionary;
	
	import kov.core.global.Global;
	import kov.display.AdvancedAnimation;
	import kov.geom.Cube;
	
	/**
	 * Body 抽象类。
	 * @author Y.Boy
	 */	
	public class Body implements IBody
	{
		protected var _wuid:uint;
		protected var _visibleCube:Cube;
		protected var _renderer:AdvancedAnimation;
		protected var _faceToLeft:Boolean;
		protected var _defaultState:IBodyState;
		protected var _currentState:IBodyState;
		protected var stateHash:Dictionary;
		
		/**
		 * 构造函数。
		 * @param visibleCube 可见（可攻击）的立体范围。
		 */		
		public function Body(visibleCube:Cube)
		{
			this.stateHash = new Dictionary();
			_renderer = new AdvancedAnimation(Global.timer);
			_visibleCube = visibleCube;
			locateAt(this.x, this.y, this.z);
		}
		
		/**
		 * x 坐标。正方体的底面中心点。
		 */		
		public function get x():Number
		{
			return _visibleCube.x + _visibleCube.width / 2;
		}
		
		public function set x(value:Number):void
		{
			_visibleCube.x = value - _visibleCube.width / 2;
			_renderer.x = value;
		}
		
		/**
		 * y 坐标。正方体的底面中心点。
		 */		
		public function get y():Number
		{
			return _visibleCube.y + _visibleCube.height / 2;
		}
		
		public function set y(value:Number):void
		{
			_visibleCube.y = value - _visibleCube.height / 2;
			_renderer.y = _visibleCube.y + _visibleCube.z;
		}
		
		/**
		 * z 坐标。正方体的底面中心点。
		 */		
		public function get z():Number
		{
			return _visibleCube.z;
		}
		
		public function set z(value:Number):void
		{
			_visibleCube.z = value;
			_renderer.y = _visibleCube.y + value;
		}
		
		/**
		 * 在世界里的唯一 ID 号。
		 */		
		public function get wuid():uint
		{
			return _wuid;
		}
		
		public function set wuid(value:uint):void
		{
			_wuid = value;
		}
		
		/**
		 * 此 Body 的渲染器。
		 */		
		public function get renderer():AdvancedAnimation
		{
			return _renderer;
		}
		
		/**
		 * 可见（可攻击）的立体范围。原点是左上角的点，非中心点。
		 */		
		public function get visibleCube():Cube
		{
			return _visibleCube;
		}
		
		/**
		 * 当前状态。
		 */		
		public function get currentState():IBodyState
		{
			return _currentState;
		}
		
		/**
		 * 获取默认的状态。
		 */		
		public function get defaultState():IBodyState
		{
			return _defaultState;
		}
		
		/**
		 * 是否面向左边。
		 */		
		public function get faceToLeft():Boolean
		{
			return _faceToLeft;
		}
		
		public function set faceToLeft(value:Boolean):void
		{
			if (_faceToLeft == value)
			{
				return;
			}
			
			_faceToLeft = value;
			this.renderer.isFlip = value;
		}
		
		/**
		 * 执行状态命令。
		 * @param stateCommand 要执行的状态命令。
		 */		
		public function executeStateCommand(stateCommand:StateCommand):void
		{
			var state:IBodyState = this.stateHash[stateCommand.stateName] as IBodyState;
			if (state)
			{
				if (_currentState)
				{
					if (state.priority >= _currentState.priority)
					{
						_currentState.exit();
						state.execute();
						_currentState = state;
					}
				}
				else
				{
					state.execute();
					_currentState = state;
				}
			}
		}
		
		/**
		 * 定位到指定点。该点是正方体底面的中心点。
		 * @param x x 坐标。
		 * @param y y 坐标。
		 * @param z z 坐标。
		 */		
		public function locateAt(x:Number, y:Number, z:Number):void
		{
			this.x = x;
			this.y = y;
			this.z = z;
		}
		
		/**
		 * 添加状态。
		 * @param state 状态。
		 * @param isDefault 指示是否为默认的状态。
		 */		
		public function addState(state:IBodyState, isDefault:Boolean = false):void
		{
			this.stateHash[state.name] = state;
			if (isDefault)
			{
				_defaultState = state;
			}
		}
		
	}
}